/*-------------------------------------------------------------------------
 *
 * partdesc.h
 *
 * Copyright (c) 1996-2022, PostgreSQL Global Development Group
 *
 * src/include/partitioning/partdesc.h
 *
 *-------------------------------------------------------------------------
 */

#ifndef PARTDESC_H
#define PARTDESC_H

#include "partitioning/partdefs.h"
#include "utils/relcache.h"


/*
 * 有关分区表分区的信息。
 *
 * 对于存在分离分区的分区表，我们只缓存包含所有分区的描述符，
 * 包括分离分区；当我们请求一个没有分离分区的描述符时，
 * 我们每次都会重新创建一个。（原因是对于每个调用者可见的
 * 分离分区集合取决于它所拥有的快照，因此几乎不可能在
 * 适当的时间从缓存中驱逐描述符。）
 */
typedef struct PartitionDescData
{
	int			nparts;			/* 分区数量 */
	bool		detached_exist; /* 是否存在分离分区？ */
	Oid		   *oids;			/* 包含 'nparts' 元素的数组，按其边界顺序存储分区 OIDs */
	bool	   *is_leaf;		/* 包含 'nparts' 元素的数组，存储对应的 'oids' 元素是否
								 * 属于叶分区 */
	PartitionBoundInfo boundinfo;	/* 分区边界的集合 */
} PartitionDescData;


extern PartitionDesc RelationGetPartitionDesc(Relation rel, bool omit_detached);

extern PartitionDirectory CreatePartitionDirectory(MemoryContext mcxt, bool omit_detached);
extern PartitionDesc PartitionDirectoryLookup(PartitionDirectory, Relation);
extern void DestroyPartitionDirectory(PartitionDirectory pdir);

extern Oid	get_default_oid_from_partdesc(PartitionDesc partdesc);

#endif							/* PARTCACHE_H */
